package controllers

import (
	"encoding/json"
	"github.com/kataras/iris/v12"
	"github.com/kataras/iris/v12/mvc"
	"github.com/kataras/iris/v12/sessions"
	"html/template"
	"iris_product/common"
	"iris_product/datamodels"
	"iris_product/rabbitmq"
	"iris_product/services"
	"os"
	"path/filepath"
	"strconv"
)




type ProductController struct {
	ProductService services.IProductService
	Ctx iris.Context
	Sess *sessions.Session
	OrderService services.IOrderService
	RabbitMq *rabbitmq.Rabbitmq
}

var (
	htmlOutPath = "./fronted/web/htmlProductShow/" // 生成的html存储目录
	tplPath = "./fronted/web/views/template/"  // 静态文件模板目录
)

// 生成静态文件
func generateStaticHtml(ctx iris.Context, template *template.Template, filename string, product *datamodels.Product) {
	var (
		err error
	)
	// 判断文件是否存在
	if existsFile(filename) {
		// 文件存在,先删除
		err = os.Remove(filename)
		if err != nil {
			ctx.Application().Logger().Error("删除文件失败")
		}
	}

	// 生成静态文件
	file,err := os.OpenFile(filename,os.O_CREATE|os.O_WRONLY,os.ModePerm)
	defer file.Close()
	if err != nil {
		ctx.Application().Logger().Error("创建静态文件失败:" + err.Error())
	}
	template.Execute(file,&product)

}

func existsFile(filename string) bool {
	_,err := os.Stat(filename)
	// os.IsExist(err) 代表如果错误为存在
	return err == nil || os.IsExist(err)
}

func (p *ProductController) GetGenerateHtml() {
	productIdString := p.Ctx.URLParam("productId")
	productId,err := strconv.ParseInt(productIdString,10,64)
	if err != nil {
		common.Log.Error("获取productId失败:" + err.Error())
	}
	// filepath.Join(tplPath) 将多个路径连接到一起,并用系统分隔符分隔
	contentTmp,err := template.ParseFiles(filepath.Join(tplPath,"product.html"))
	if err != nil {
		p.Ctx.Application().Logger().Debug("初始化模板文件失败:" + err.Error())
	}
	// 获取html生成路径
	filename := filepath.Join(htmlOutPath,"htmlProduct.html")
	productInfo,err := p.ProductService.GetProductById(productId)
	if err != nil {
		p.Ctx.Application().Logger().Error("获取product信息失败:" + err.Error())
	}
	generateStaticHtml(p.Ctx,contentTmp,filename,productInfo)



}

func (p *ProductController) GetDetail() mvc.View {
	// 获取productId字段
	productId := 2
	// 获取商品信息
	productInfo, err := p.ProductService.GetProductById(int64(productId))
	if err != nil {
		common.Log.Error("获取失败:" + err.Error())
	}

	return mvc.View{
		Layout: "shared/productLayout.html",
		Name: "product/view.html",
		Data: iris.Map{
			"product":productInfo,
		},
	}
}

func (p *ProductController) GetOrder() []byte {
	productIdStr := p.Ctx.URLParam("productID")
	productId,err := strconv.ParseInt(productIdStr,10,64)
	if err != nil {
		common.Log.Error("错误:" + err.Error())
		//p.Ctx.Redirect("/users/error")
		return []byte("false")
	}
	userIdStr := p.Ctx.GetCookie("uid")
	userId,err := strconv.ParseInt(userIdStr,10,64)
	if err != nil {
		common.Log.Error("错误:" + err.Error())
		//p.Ctx.Redirect("/users/error")
		//return mvc.View{}
		return []byte("false")
	}

	// 写入MQ
	message := &rabbitmq.Message{
		UserID:    userId,
		ProductId: productId,
	}
	messageStr,_ := json.Marshal(message)
	p.RabbitMq.PushMessage(string(messageStr))

	return []byte("true")

	//// 获取商品
	//productInfo ,err:= p.ProductService.GetProductById(productId)
	//if err != nil {
	//	common.Log.Error("错误:" + err.Error())
	//	p.Ctx.Redirect("/users/error")
	//	return mvc.View{}
	//}
	//var orderId int64
	//orderId = 0
	//showMessage := "抢购失败"
	//if productInfo.ProductNum > 0 {
	//	// 抢购
	//	// 数量减一
	//	productInfo.ProductNum = productInfo.ProductNum - 1
	//	err = p.ProductService.UpdateProduct(productInfo)
	//	if err != nil {
	//		common.Log.Error("错误:" + err.Error())
	//		p.Ctx.Redirect("/users/error")
	//		return mvc.View{}
	//	}
	//	// 创建订单
	//	orderInfo := &datamodels.Order{
	//		UserId:  userId,
	//		ProductId:   productId,
	//		OrderStatus: 1,
	//	}
	//	orderId,err =p.OrderService.InsertOrder(orderInfo)
	//	if err != nil {
	//		common.Log.Error("错误:" + err.Error())
	//		p.Ctx.Redirect("/users/error")
	//		return mvc.View{}
	//	}
	//	showMessage = "抢购成功"
	//}
	//return mvc.View{
	//	Layout: "shared/productLayout.html",
	//	Name:"product/result.html",
	//	Data: iris.Map{
	//		"orderID":orderId,
	//		"showMessage":showMessage,
	//	},
	//}



}